package org.lemon.transport.context.session;

import org.lemon.transport.context.data.device.Device;
import org.lemon.transport.context.data.device.DeviceProfile;
import org.server.transport.gen.SessionProto;
import org.server.transport.gen.TransportProto;

import java.util.Optional;
import java.util.UUID;

public interface SessionMsgListener {

    /**
     * session 关闭命令
     *
     * @param sessionId
     * @param sessionCloseNotification
     */
    void onRemoteSessionCloseCommand(UUID sessionId, TransportProto.SessionCloseNotificationProto sessionCloseNotification);

    /**
     * 获取属性信息的响应
     *
     * @param attributesResponse
     */
    void onGetAttributesResponse(TransportProto.GetAttributeResponseMsg attributesResponse);

    /**
     * 属性更新
     *
     * @param sessionId
     * @param attributeUpdateNotification
     */
    void onAttributeUpdate(UUID sessionId, TransportProto.AttributeUpdateNotificationMsg attributeUpdateNotification);

    /**
     * 设备信息更新
     *
     * @param sessionInfo
     * @param device
     * @param deviceProfileOpt
     */
    void onDeviceUpdate(SessionProto.SessionInfoProto sessionInfo, Device device, Optional<DeviceProfile> deviceProfileOpt);

    /**
     * 设备删除
     *
     * @param deviceId
     */
    void onDeviceDeleted(Long deviceId);

    /**
     * 设备配置有更新
     *
     * @param newSessionInfo
     * @param deviceProfile
     */
    void onDeviceProfileUpdate(SessionProto.SessionInfoProto newSessionInfo, DeviceProfile deviceProfile);

    /**
     * 发送给设备的 RPC 请求
     *
     * @param sessionId
     * @param toDeviceRequest
     */
    void onToDeviceRpcRequest(UUID sessionId, TransportProto.ToDeviceRpcRequestMsg toDeviceRequest);

    /**
     * 设备请求服务端的 RPC 信息响应
     *
     * @param toServerResponse
     */
    void onToServerRpcResponse(TransportProto.ToServerRpcResponseMsg toServerResponse);


    /**
     * 传输凭证更新
     *
     * @param toTransportUpdateCredentials
     */
    default void onToTransportUpdateCredentials(TransportProto.ToTransportUpdateCredentialsProto toTransportUpdateCredentials) {
    }
}
